/*数组：一组地址连续的相同数据类型的元素
    数组的名称：数组首元素的地址（+1走过一个元素）
    a + i == &a[i]  //同理&a[-i] == a - i
    
    &a：数组的首地址（+1走过一个数组）
    
    指针的大小和数据类型没有关系
    指针的数据类型就是指针的步长
    char * + 1      1
    int * + 1       4
    double * + 1    8 */

#include <stdio.h>

#define Size 3

#if 0
//数组在作为函数参数传递到函数时，会被弱化成指针
//函数的定义（包括机器代码实现）存储在程序的代码段中，而函数的局部变量和参数存储在栈帧中。函数的声明在编译时用于类型检查和函数调用，不会分配实际的存储空间。 
//当在main函数里定义了一个数组，把数组作为参数传递给函数时，不会在栈里再去开辟一个数组将其复制过来，因为栈比较小（一般来说3~4M），所以数组从一开始传递的时候，就没有被整个打包带走过，一直传的都是它的地址，就是数组的首元素地址（&a[0]）
void PrintArray(int a[Size])    //相当于void PrintArray(int *a)       
{
    printf("size of a : %ld\n", sizeof(a)); //8
    //访问数组
    for(int i = 0; i < Size; i++)
    {
        printf("%d %p\n", a[i], &a[i]); //地址很长，用十六进制表示（1~F）
    }
}
#endif

int main()
{
    //[]放数组元素的个数
    //下标从0开始
    //a[0] a[1] a[2]
    //数组的初始化
    int a[Size] = {1, 2, 3};    //（int a[Size] = {0}这种就是把每个元素都初始化为0）
    
    //PrintArray(a);

    printf("a:%p\n&a: %p\n&a[0]: %p\n", a, &a, &a[0]);  //打印出来都是一样的
    printf("=======================\n");
    printf("a:%p\n&a: %p\n&a[0]: %p\n", a+1, &a+1, &a[0]+1);

    char * p = a;
    printf("p : %p\n", p+1);

    return 0;

}